package com.ruoyi.web.configuration;

import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.equ.domain.EquAsset;
import com.ruoyi.equ.service.IEquAssetService;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysNoticeService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import java.util.List;

@Slf4j
@EnableScheduling // 开启定时任务
//@Configuration // 此注解必须加,不加不会扫描到定时任务,也可使用@Component
public class ScheduleTask {
    @Autowired
    private IEquAssetService equAssetService;
    @Autowired
    private ISysDeptService sysDeptService;
    @Autowired
    private ISysNoticeService sysNoticeService;
    @Autowired
    private ISysUserService sysUserService;
    @Autowired
    private ISysRoleService sysRoleService;
    /**
     * 定时任务
     * scheduleTask1只会拿到 距离报废1个月以内的设备信息
     * scheduleTask2只会拿到 距离报废1年的设备信息
     */
    public String ONE_MONTH = "1个月";
    public String ONE_YEAR = "1年";
    @Scheduled(cron = "0 0 * * * ?") // 每天 00:00 执行
        private void scheduleTask1() {
        // 从购置日期开始计算，如果使用日期在 购置日期+使用年限 之前一年，则进行每月一次报废提醒
        // 从购置日期开始计算，如果使用日期在 购置日期+使用年限 之前一月，则进行每天一次报废提醒
        // 例如 购置日期是2020-01-01，使用年限是5年，则报废日期是2025-01-01
        // 购置日期格式：2025-09-01  ； 规定使用年限格式：5
        // 通知格式：“内科呼吸机（编号YYSB-2020-001）距报废1年，请评估是否需提前采购替代设备”
        // 先查询到所有距离报废  1个月  以内的设备的信息，再进行遍历
        EquAsset equAsset = new EquAsset();
        List<EquAsset> equAssetList = equAssetService.selectBroken1MouthEquAssetList(equAsset);
        // 找到资产管理员
        List<SysUser> assetAdminList =getAssetAdminList();
        // 拿到信息之后遍历获取到 设备的型号 设备名称 设备存放的科室的负责人 资产管理部门 资产管理员
        for (EquAsset asset : equAssetList){
            // 设备名称
            String assetName = asset.getAssetName();
            // 设备型号
            String assetNumber = asset.getAssetNumber();
            // 发送消息
            String noticeContent = "设备报废提醒：" + assetName + "(编号" + assetNumber + ")距报废不到"+ONE_MONTH+"，请尽快发起报废申请";
            SysNotice notice = setNotice(noticeContent);
            // 先发送消息给 科室负责人
            // 获取到负责人的userName
            // 存放科室
            String deptName = asset.getUseDept();
            SysDept sysDept = sysDeptService.selectDeptByName(deptName);
            String leader = sysDept.getLeader();
            SysUser sysUser = sysUserService.selectUserByUserName(leader);
            notice.setAcceptId(sysUser.getUserId());
            int i1 = sysNoticeService.insertNotice(notice);
            if (i1 <= 0 ){
                log.error("发送消息失败");
                return ;
            }
            // 再发送消息给 资产管理员
            for (SysUser assetAdmin : assetAdminList){
                notice.setAcceptId(assetAdmin.getUserId());
                int i2 = sysNoticeService.insertNotice(notice);
                if (i2 <= 0 ){
                    log.error("发送消息失败");
                    return ;
                }
            }
            //            sysNoticeService.insertNotice()
        }
    }

    @Scheduled(cron = "0 0 1 * * ?") // 每月 1 日 00:00 执行
        private void scheduleTask2() {
        // 从购置日期开始计算，如果使用日期在 购置日期+使用年限 之前一年，则进行每月一次报废提醒
        // 从购置日期开始计算，如果使用日期在 购置日期+使用年限 之前一月，则进行每天一次报废提醒
        // 例如 购置日期是2020-01-01，使用年限是5年，则报废日期是2025-01-01
        // 购置日期格式：2025-09-01  ； 规定使用年限格式：5
        // 通知格式：“内科呼吸机（编号YYSB-2020-001）距报废1年，请评估是否需提前采购替代设备”
        // 先查询到所有距离报废  1年  以内的设备的信息，再进行遍历
        // 先查询到所有距离报废  1个月  以内的设备的信息，再进行遍历
        EquAsset equAsset = new EquAsset();
        List<EquAsset> equAssetList = equAssetService.selectBroken1YearEquAssetList(equAsset);
        // 找到资产管理员
        List<SysUser> assetAdminList =getAssetDeptAdminList();
        // 拿到信息之后遍历获取到 设备的型号 设备名称 设备存放的科室的负责人 资产管理部门 资产管理员
        for (EquAsset asset : equAssetList){
            // 设备名称
            String assetName = asset.getAssetName();
            // 设备型号
            String assetNumber = asset.getAssetNumber();
            // 存放科室
            String deptName = asset.getUseDept();
            SysDept sysDept = sysDeptService.selectDeptByName(deptName);
            // 发送消息
            String noticeContent = "设备报废提醒：" + assetName + "(编号" + assetNumber + ")距报废不到"+ONE_YEAR+"，请评估是否需提前采购替代设备";
            SysNotice notice = setNotice(noticeContent);
            // 获取到负责人的userName
            String leader = sysDept.getLeader();
            SysUser sysUser = sysUserService.selectUserByUserName(leader);
            notice.setAcceptId(sysUser.getUserId());
            // 先发送消息给 科室负责人
            int i1 = sysNoticeService.insertNotice(notice);
            if (i1 <= 0 ){
                log.error("发送消息失败");
                return ;
            }
            // 再发送消息给 资产管理员
            for (SysUser assetAdmin : assetAdminList){
                notice.setAcceptId(assetAdmin.getUserId());
                int i2 = sysNoticeService.insertNotice(notice);
                if (i2 <= 0 ){
                    log.error("发送消息失败");
                    return ;
                }
            }
            //            sysNoticeService.insertNotice()
        }
    }
    private SysNotice setNotice( String noticeContent) {
        SysNotice sysNotice = new SysNotice();
        sysNotice.setNoticeTitle("设备报废提醒");
        sysNotice.setNoticeType("1");
        sysNotice.setPublishId(0L);
        sysNotice.setPublishName("系统");
        sysNotice.setNoticeContent(noticeContent);
        sysNotice.setStatus("0");
        return sysNotice;
    }

    /**
     *  通过部门名称找到部门中的人员getAssetDeptAdminList
     *
     */
    private List<SysUser> getAssetDeptAdminList() {
        SysDept sysDept1 = new SysDept();
        sysDept1.setDeptName("资产管理部");
        // 通过 角色名称 获取到该角色的 角色id roleId
        List<SysDept> sysDepts = sysDeptService.selectDeptList(sysDept1);
        // 通过 roleId 获取到 角色 资产管理员 的id
        Long deptId = sysDepts.get(0).getDeptId();
        // 通过 角色 资产管理员 id 获取到  绑定了该角色的成员
        SysUser sysUser2 =new SysUser();
        sysUser2.setDeptId(deptId);
        List<SysUser> sysUserlist = sysUserService.selectUserList(sysUser2);
        // 返回  该部门的所有成员  名单信息
        return sysUserlist;
    }

/**
 *  通过角色名称找到角色中的人员getAssetAdminList
 */

 private List<SysUser> getAssetAdminList() {
        SysRole sysRole = new SysRole();
        sysRole.setRoleName("资产管理员");
        // 通过 角色名称 获取到该角色的 角色id roleId
        List<SysRole> sysRoles = sysRoleService.selectRoleList(sysRole);
        // 通过 roleId 获取到 角色 资产管理员 的id
        Long roleId = sysRoles.get(0).getRoleId();
        // 通过 角色 资产管理员 id 获取到  绑定了该角色的成员
        SysUser sysUser2 =new SysUser();
        sysUser2.setRoleId(roleId);
        List<SysUser> sysUserlist = sysUserService.selectUserList(sysUser2);
        // 返回  绑定了该角色的成员  名单信息
        return sysUserlist;
    }




}
